home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Games / NetHack 3.1.3 / source / src / potion.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-01  |  29.9 KB  |  1,273 lines  |  [TEXT/R*ch]

  1. /*    SCCS Id: @(#)potion.c    3.1    93/07/07    */
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include "hack.h"
  6.  
  7. #ifdef OVLB
  8. static void NDECL(ghost_from_bottle);
  9. static boolean FDECL(neutralizes, (struct obj *,struct obj *));
  10.  
  11. static NEARDATA int nothing, unkn;
  12. #endif /* OVLB */
  13.  
  14. extern boolean notonhead;    /* for long worms */
  15. #ifdef OVLB
  16. boolean notonhead = FALSE;
  17. #endif /* OVLB */
  18.  
  19. #ifdef OVLB
  20.  
  21. static NEARDATA const char beverages[] = { POTION_CLASS, 0 };
  22.  
  23. void
  24. make_confused(xtime,talk)
  25. long xtime;
  26. boolean talk;
  27. {
  28.     long old = HConfusion;
  29.  
  30.     if (!xtime && old) {
  31.         if (talk) {
  32.             if (Hallucination) You("feel less trippy now.");
  33.             else           You("feel less confused now.");
  34.         }
  35.         flags.botl = 1;
  36.     }
  37.     if (xtime && !old)
  38.         flags.botl = 1;
  39.     HConfusion = xtime;
  40. }
  41.  
  42. void
  43. make_stunned(xtime,talk)
  44. long xtime;
  45. boolean talk;
  46. {
  47.     long old = HStun;
  48.  
  49.     if (!xtime && old) {
  50.         if (talk) {
  51.             if (Hallucination) You("feel less wobbly now.");
  52.             else           You("feel a bit steadier now.");
  53.         }
  54.         flags.botl = 1;
  55.     }
  56.     if (xtime && !old) {
  57.         if (talk)
  58.             You("stagger...");
  59.         flags.botl = 1;
  60.     }
  61.     HStun = xtime;
  62. }
  63.  
  64. void
  65. make_sick(xtime, talk)
  66. long xtime;
  67. boolean talk;
  68. {
  69.     long old = Sick;
  70.  
  71. #ifdef POLYSELF
  72.     if (xtime && u.usym == S_FUNGUS) return;
  73. #endif
  74.     if (!xtime && old) {
  75.         if (talk) pline("What a relief!");
  76.         flags.botl = 1;
  77.     }
  78.     if (!old && xtime) {
  79.         You("feel deathly sick.");
  80.         flags.botl = 1;
  81.     }
  82.     Sick = xtime;
  83. }
  84.  
  85. void
  86. make_vomiting(xtime, talk)
  87. long xtime;
  88. boolean talk;
  89. {
  90.     long old = Vomiting;
  91.  
  92.     if(!xtime && old)
  93.         if(talk) You("feel much less nauseous now.");
  94.  
  95.     Vomiting = xtime;
  96. }
  97.  
  98.  
  99. void
  100. make_blinded(xtime, talk)
  101. long xtime;
  102. boolean talk;
  103. {
  104.     long old = Blinded;
  105.     boolean changed = 0;
  106.  
  107.     if (u.usleep) talk = FALSE;
  108.  
  109.     if (!xtime && old && !Blindfolded
  110. #ifdef POLYSELF
  111.         && haseyes(uasmon)
  112. #endif
  113.         ) {
  114.         if (talk) {
  115.         if (Hallucination)
  116.             pline("Far out!  Everything is all cosmic again!");
  117.         else           You("can see again.");
  118.         }
  119.         changed = TRUE;
  120.     }
  121.     if (xtime && !old && !Blindfolded
  122. #ifdef POLYSELF
  123.         && haseyes(uasmon)
  124. #endif
  125.         ) {
  126.         if (talk) {
  127.         if (Hallucination) pline("Oh, bummer!  Everything is dark!  Help!");
  128.         else           pline("A cloud of darkness falls upon you.");
  129.         }
  130.         changed = TRUE;
  131.  
  132.         /* Before the hero goes blind, set the ball&chain variables. */
  133.         if (Punished) set_bc(0);
  134.     }
  135.     Blinded = xtime;
  136.     if (changed) {
  137.         flags.botl = 1;
  138.         vision_full_recalc = 1;
  139.         if (Telepat) see_monsters();
  140.     }
  141. }
  142.  
  143. void
  144. make_hallucinated(xtime, talk, mask)
  145. long xtime;    /* nonzero if this is an attempt to turn on hallucination */
  146. boolean talk;
  147. long mask;    /* nonzero if resistance status should change by mask */
  148. {
  149.     boolean changed = 0;
  150. #ifdef LINT
  151.     const char *message = 0;
  152. #else
  153.     const char *message;
  154. #endif
  155.  
  156.     if (!xtime)
  157.         message = "Everything looks SO boring now.";
  158.     else
  159.         message = "Oh wow!  Everything seems so cosmic!";
  160.  
  161.     if (mask) {
  162.         if (HHallucination) changed = TRUE;
  163.  
  164.         if (!xtime) HHalluc_resistance |= mask;
  165.         else HHalluc_resistance &= ~mask;
  166.     } else {
  167.         if (!HHalluc_resistance && (!!HHallucination != !!xtime))
  168.         changed = TRUE;
  169.         HHallucination = xtime;
  170.     }
  171.  
  172.     if (changed) {
  173.         if (u.uswallow) {
  174.         swallowed(0);    /* redraw swallow display */
  175.         } else {
  176.         /* The see_* routines should be called *before* the pline. */
  177.         see_monsters();
  178.         see_objects();
  179.         }
  180.         flags.botl = 1;
  181.         if (!Blind && talk) pline(message);
  182.     }
  183. }
  184.  
  185. static void
  186. ghost_from_bottle()
  187. {
  188.     struct monst *mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy);
  189.  
  190.     if (!mtmp) {
  191.         pline("This bottle turns out to be empty.");
  192.         return;
  193.     }
  194.     if (Blind) {
  195.         pline("As you open the bottle, something emerges.");
  196.         return;
  197.     }
  198.     pline("As you open the bottle, an enormous %s emerges!",
  199.         Hallucination ? rndmonnam() : (const char *)"ghost");
  200.     if(flags.verbose)
  201.         You("are frightened to death, and unable to move.");
  202.     nomul(-3);
  203.     nomovemsg = "You regain your composure.";
  204. }
  205.  
  206. int
  207. dodrink() {
  208.     register struct obj *otmp;
  209.     const char *potion_descr;
  210.  
  211.     if (Strangled) {
  212.         pline("If you can't breathe air, how can you drink liquid?");
  213.         return 0;
  214.     }
  215.     /* Is there a fountain to drink from here? */
  216.     if (IS_FOUNTAIN(levl[u.ux][u.uy].typ) && !Levitation) {
  217.         if(yn("Drink from the fountain?") == 'y') {
  218.             drinkfountain();
  219.             return 1;
  220.         }
  221.     }
  222. #ifdef SINKS
  223.     /* Or a kitchen sink? */
  224.     if (IS_SINK(levl[u.ux][u.uy].typ)) {
  225.         if (yn("Drink from the sink?") == 'y') {
  226.             drinksink();
  227.             return 1;
  228.         }
  229.     }
  230. #endif
  231.  
  232.     otmp = getobj(beverages, "drink");
  233.     if(!otmp) return(0);
  234. #ifndef NO_SIGNAL
  235.     otmp->in_use = TRUE;        /* you've opened the stopper */
  236. #endif
  237.     potion_descr = OBJ_DESCR(objects[otmp->otyp]);
  238.     if (potion_descr && !strcmp(potion_descr, "milky") && !rn2(13)) {
  239.         ghost_from_bottle();
  240.         useup(otmp);
  241.         return(1);
  242.     } else if (potion_descr && !strcmp(potion_descr, "smoky") && !rn2(13)) {
  243.         djinni_from_bottle(otmp);
  244.         useup(otmp);
  245.         return(1);
  246.     }
  247.     return dopotion(otmp);
  248. }
  249.  
  250. int
  251. dopotion(otmp)
  252. register struct obj *otmp;
  253. {
  254.     int retval;
  255.  
  256.     nothing = unkn = 0;
  257.     if((retval = peffects(otmp)) >= 0) return(retval);
  258.  
  259.     if(nothing) {
  260.         unkn++;
  261.         You("have a %s feeling for a moment, then it passes.",
  262.           Hallucination ? "normal" : "peculiar");
  263.     }
  264.     if(otmp->dknown && !objects[otmp->otyp].oc_name_known) {
  265.         if(!unkn) {
  266.             makeknown(otmp->otyp);
  267.             more_experienced(0,10);
  268.         } else if(!objects[otmp->otyp].oc_uname)
  269.             docall(otmp);
  270.     }
  271.     useup(otmp);
  272.     return(1);
  273. }
  274.  
  275. int
  276. peffects(otmp)
  277.     register struct obj    *otmp;
  278. {
  279.     register int i, ii, isdone;
  280.  
  281.     switch(otmp->otyp){
  282.     case POT_RESTORE_ABILITY:
  283.     case SPE_RESTORE_ABILITY:
  284.         unkn++;
  285.         if(otmp->cursed) {
  286.             pline("Ulch!  This makes you feel mediocre!");
  287.             break;
  288.         } else {
  289.             pline("Wow!  This makes you feel %s!",
  290.               (otmp->blessed) ? "great" : "good");
  291.             i = rn2(A_MAX);        /* start at a random point */
  292.             for(isdone = ii = 0; !isdone && ii < A_MAX; ii++) {
  293.             if(ABASE(i) < AMAX(i)) {
  294.                 ABASE(i) = AMAX(i);
  295.                 /* only first found if not blessed */
  296.                 isdone = !(otmp->blessed);
  297.                 flags.botl = 1;
  298.             }
  299.             if(++i >= A_MAX) i = 0;
  300.             }
  301.             if((ABASE(A_STR) == AMAX(A_STR)) && (u.uhs >= 3))
  302.             losestr(1);        /* kludge - mrs */
  303.         }
  304.         break;
  305.     case POT_HALLUCINATION:
  306.         if (Hallucination || HHalluc_resistance) nothing++;
  307.         make_hallucinated(HHallucination +
  308.               rn1(200, 600 - 300*bcsign(otmp)), TRUE, 0L);
  309.         break;
  310.     case POT_WATER:
  311.         if(!otmp->blessed && !otmp->cursed) {
  312.             pline("This tastes like %swater.",
  313.                   otmp->odiluted ? "impure " : "");
  314.             lesshungry(rnd(otmp->odiluted ? 3 : 10));
  315.             break;
  316.         }
  317.         unkn++;
  318.         if(
  319. #ifdef POLYSELF
  320.            is_undead(uasmon) || is_demon(uasmon) ||
  321. #endif
  322.                 u.ualign.type == A_CHAOTIC) {
  323.             if(otmp->blessed) {
  324.             pline("This burns like acid!");
  325.             exercise(A_CON, FALSE);
  326. #ifdef POLYSELF
  327.             if (u.ulycn != -1) {
  328.                 Your("affinity to %s disappears!",
  329.                      makeplural(mons[u.ulycn].mname));
  330.                 if(uasmon == &mons[u.ulycn] && !Polymorph_control)
  331.                     rehumanize();
  332.                 u.ulycn = -1;
  333.             }
  334. #endif
  335.             losehp(d(2,6), "potion of holy water", KILLED_BY_AN);
  336.             } else if(otmp->cursed) {
  337.             You("feel quite proud of yourself.");
  338.             healup(d(2,6),0,0,0);
  339.             exercise(A_CON, TRUE);
  340.             }
  341.         } else
  342.             if(otmp->blessed) {
  343.             You("feel full of awe.");
  344.             make_sick(0L,TRUE);
  345.             exercise(A_WIS, TRUE);
  346.             exercise(A_CON, TRUE);
  347. #ifdef POLYSELF
  348.             if (u.ulycn != -1) {
  349.                 You("feel purified.");
  350.                 if(uasmon == &mons[u.ulycn] && !Polymorph_control)
  351.                     rehumanize();
  352.                 u.ulycn = -1;
  353.             }
  354. #endif
  355.             /* make_confused(0L,TRUE); */
  356.             } else {
  357.             if(u.ualign.type == A_LAWFUL) {
  358.                 pline("This burns like acid!");
  359.                 losehp(d(2,6), "potion of unholy water",
  360.                 KILLED_BY_AN);
  361.             } else
  362.                 You("feel full of dread.");
  363.             exercise(A_CON, FALSE);
  364.             }
  365.         break;
  366.     case POT_BOOZE:
  367.         unkn++;
  368.         pline("Ooph!  This tastes like %s%s!",
  369.               otmp->odiluted ? "watered down " : "",
  370.               Hallucination ? "furniture polish" : "liquid fire");
  371.         if (!otmp->blessed) make_confused(HConfusion + d(3,8),FALSE);
  372.         /* the whiskey makes us feel better */
  373.         if (u.uhp < u.uhpmax && !otmp->odiluted)
  374.             losehp(-1, "", 0); /* can't kill you */
  375.         lesshungry(10 * (2 + bcsign(otmp)));
  376.         exercise(A_WIS, FALSE);
  377.         if(otmp->cursed) {
  378.             You("pass out.");
  379.             multi = -rnd(15);
  380.             nomovemsg = "You awake with a headache.";
  381.         }
  382.         break;
  383.     case POT_ENLIGHTENMENT:
  384.         if(otmp->cursed) {
  385.             unkn++;
  386.             You("have an uneasy feeling...");
  387.         } else {
  388.             if (otmp->blessed) {
  389.                 (void) adjattrib(A_INT, 1, FALSE);
  390.                 (void) adjattrib(A_WIS, 1, FALSE);
  391.             }
  392.             You("feel self-knowledgeable...");
  393.             display_nhwindow(WIN_MESSAGE, FALSE);
  394.             enlightenment(FALSE);
  395.             pline("The feeling subsides.");
  396.         }
  397.         exercise(A_WIS, !otmp->cursed);
  398.         break;
  399.     case POT_INVISIBILITY:
  400.     case SPE_INVISIBILITY:
  401.         if(Invisible || See_invisible) nothing++;
  402.         else {
  403.              if(!Blind)
  404.                pline(Hallucination ?
  405.              "Far out, man!  You can see right through yourself!" :
  406.              "Gee!  All of a sudden, you can't see yourself.");
  407.              else
  408.                You("feel rather airy."), unkn++;
  409.         }
  410.         if (otmp->blessed && !(HInvis & FROMOUTSIDE)) {
  411.             nothing = 0;
  412.             if(yn("Do you want the invisibility to be permanent?")
  413.                 == 'n')
  414.                 HInvis += rn1(15,31);
  415.             else HInvis |= FROMOUTSIDE;
  416.         } else HInvis += rn1(15,31);
  417.         newsym(u.ux,u.uy);    /* update position */
  418.         if(otmp->cursed) {
  419.             pline("For some reason, you feel your presence is known.");
  420.             aggravate();
  421.         }
  422.         break;
  423.     case POT_SEE_INVISIBLE:
  424.         /* tastes like fruit juice in Rogue */
  425.     case POT_FRUIT_JUICE:
  426.         unkn++;
  427.         if(otmp->cursed)
  428.             pline("Yecch!  This tastes %s.",
  429.               Hallucination ? "overripe" : "rotten"
  430.              );
  431.         else pline (Hallucination ?
  432. #ifdef TUTTI_FRUTTI
  433.            "This tastes like 10%% real %s juice all-natural beverage." :
  434.            "This tastes like %s%s juice.",
  435.            otmp->odiluted ? "reconstituted " : "", pl_fruit
  436. #else
  437.            "This tastes like 10%% real fruit juice all-natural beverage." :
  438.            "This tastes like %sfruit juice.",
  439.            otmp->odiluted ? "reconstituted " : ""
  440. #endif
  441.                 );
  442.         if (otmp->otyp == POT_FRUIT_JUICE) {
  443.             lesshungry((otmp->odiluted ? 5 : 10) * (2 + bcsign(otmp)));
  444.             break;
  445.         }
  446.         if (!otmp->cursed) {
  447.             /* Tell them they can see again immediately, which
  448.              * will help them identify the potion...
  449.              */
  450.             make_blinded(0L,TRUE);
  451.         }
  452.         if (otmp->blessed)
  453.             HSee_invisible |= FROMOUTSIDE;
  454.         else
  455.             HSee_invisible += rn1(100,750);
  456.         set_mimic_blocking(); /* do special mimic handling */
  457.         see_monsters();    /* see invisible monsters */
  458.         newsym(u.ux,u.uy); /* see yourself! */
  459.         break;
  460.     case POT_PARALYSIS:
  461.         if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))
  462.             You("are motionlessly suspended.");
  463.         else
  464.             Your("%s are frozen to the %s!",
  465.              makeplural(body_part(FOOT)), surface(u.ux, u.uy));
  466.         nomul(-(rn1(10, 25 - 12*bcsign(otmp))));
  467.         exercise(A_DEX, FALSE);
  468.         break;
  469.     case POT_MONSTER_DETECTION:
  470.     case SPE_DETECT_MONSTERS:
  471.         if (monster_detect(otmp, 0))
  472.             return(1);        /* nothing detected */
  473.         exercise(A_WIS, TRUE);
  474.         break;
  475.     case POT_OBJECT_DETECTION:
  476.     case SPE_DETECT_TREASURE:
  477.         if (object_detect(otmp, 0))
  478.             return(1);        /* nothing detected */
  479.         exercise(A_WIS, TRUE);
  480.         break;
  481.     case POT_SICKNESS:
  482.         pline("Yecch!  This stuff tastes like poison.");
  483.         if (otmp->blessed) {
  484. #ifdef TUTTI_FRUTTI
  485.         pline("(But in fact it was mildly stale %s juice.)", pl_fruit);
  486. #else
  487.         pline("(But in fact it was mildly stale orange juice.)");
  488. #endif
  489.             if (pl_character[0] != 'H')
  490.                 losehp(1, "mildly contaminated potion",
  491.                     KILLED_BY_AN);
  492.         } else {
  493.             if(Poison_resistance)
  494. #ifdef TUTTI_FRUTTI
  495.     pline("(But in fact it was biologically contaminated %s juice.)",pl_fruit);
  496. #else
  497.     pline("(But in fact it was biologically contaminated orange juice.)");
  498. #endif
  499.             if (pl_character[0] == 'H')
  500.             pline("Fortunately, you have been immunized.");
  501.             else {
  502.             int typ = rn2(A_MAX);
  503.             poisontell(typ);
  504.             (void) adjattrib(typ,
  505.                     Poison_resistance ? -1 : -rn1(4,3),
  506.                     TRUE);
  507.             if(!Poison_resistance)
  508.                 losehp(rnd(10)+5*!!(otmp->cursed),
  509.                        "contaminated potion", KILLED_BY_AN);
  510.             exercise(A_CON, FALSE);
  511.             }
  512.         }
  513.         if(Hallucination) {
  514.             You("are shocked back to your senses!");
  515.             make_hallucinated(0L,FALSE,0L);
  516.         }
  517.         break;
  518.     case POT_CONFUSION:
  519.         if(!Confusion)
  520.             if (Hallucination) {
  521.             pline("What a trippy feeling!");
  522.             unkn++;
  523.             } else
  524.             pline("Huh, What?  Where am I?");
  525.         else    nothing++;
  526.         make_confused(HConfusion + rn1(7,16-8*bcsign(otmp)),FALSE);
  527.         break;
  528.     case POT_GAIN_ABILITY:
  529.         if(otmp->cursed) {
  530.             pline("Ulch!  That potion tasted foul!");
  531.             unkn++;
  532.         } else {      /* If blessed, increase all; if not, try up to */
  533.             int itmp; /* 6 times to find one which can be increased. */
  534.             i = -1;        /* increment to 0 */
  535.             for (ii = A_MAX; ii > 0; ii--) {
  536.             i = (otmp->blessed ? i + 1 : rn2(A_MAX));
  537.             /* only give "your X is already as high as it can get"
  538.                message on last attempt (except blessed potions) */
  539.             itmp = (otmp->blessed || ii == 1) ? 0 : -1;
  540.             if (adjattrib(i, 1, itmp) && !otmp->blessed)
  541.                 break;
  542.             }
  543.         }
  544.         break;
  545.     case POT_SPEED:
  546.         if(Wounded_legs && !otmp->cursed) {
  547.             heal_legs();
  548.             unkn++;
  549.             break;
  550.         }        /* and fall through */
  551.     case SPE_HASTE_SELF:
  552.         if(!(Fast & ~INTRINSIC)) /* wwf@doe.carleton.ca */
  553.             You("are suddenly moving %sfaster.",
  554.                 Fast ? "" : "much ");
  555.         else {
  556.             Your("%s get new energy.",
  557.                 makeplural(body_part(LEG)));
  558.             unkn++;
  559.         }
  560.         exercise(A_DEX, TRUE);
  561.         Fast += rn1(10,100+60*bcsign(otmp));
  562.         break;
  563.     case POT_BLINDNESS:
  564.         if(Blind) nothing++;
  565.         make_blinded(Blinded + rn1(200, 250-125*bcsign(otmp)), TRUE);
  566.         break;
  567.     case POT_GAIN_LEVEL:
  568.         if (otmp->cursed) {
  569.             unkn++;
  570.             /* they went up a level */
  571.             if((ledger_no(&u.uz) == 1 && u.uhave.amulet) ||
  572.                               Can_rise_up(&u.uz)) {
  573.                 const char *riseup = "rise up, through the ceiling!";
  574.                 if(ledger_no(&u.uz) == 1) {
  575.                     You(riseup);
  576.                 goto_level(&earth_level, FALSE, FALSE, FALSE);
  577.                 } else {
  578.                     register int newlev = depth(&u.uz)-1;
  579.                 d_level newlevel;
  580.  
  581.                 get_level(&newlevel, newlev);
  582.                 if(on_level(&newlevel, &u.uz)) {
  583.                     pline("It tasted bad.");
  584.                     break;
  585.                 } else You(riseup);
  586.                 goto_level(&newlevel, FALSE, FALSE, FALSE);
  587.                 }
  588.             }
  589.             else You("have an uneasy feeling.");
  590.             break;
  591.         }
  592.         pluslvl();
  593.         if (otmp->blessed)
  594.             /* blessed potions place you at a random spot in the
  595.              * middle of the new level instead of the low point
  596.              */
  597.             u.uexp = rndexp();
  598.         break;
  599.     case POT_HEALING:
  600.         You("begin to feel better.");
  601.         healup(d(5,2) + 5 * bcsign(otmp),
  602.                1, !!(otmp->blessed), !(otmp->cursed));
  603.         exercise(A_STR, TRUE);
  604.         break;
  605.     case POT_EXTRA_HEALING:
  606.         You("feel much better.");
  607.         healup(d(5,4) + 5 * bcsign(otmp),
  608.                2+3*!!(otmp->blessed), !(otmp->cursed), 1);
  609.         make_hallucinated(0L,TRUE,0L);
  610.         exercise(A_STR, TRUE);
  611.         exercise(A_CON, TRUE);
  612.         break;
  613.     case POT_LEVITATION:
  614.     case SPE_LEVITATION:
  615.         if(!Levitation) {
  616.             /* kludge to ensure proper operation of float_up() */
  617.             HLevitation = 1;
  618.             float_up();
  619.             /* reverse kludge */
  620.             HLevitation = 0;
  621.             if (otmp->cursed && !Is_waterlevel(&u.uz)) {
  622.     if((u.ux != xupstair || u.uy != yupstair)
  623.        && (u.ux != sstairs.sx || u.uy != sstairs.sy || !sstairs.up)
  624.        && (!xupladder || u.ux != xupladder || u.uy != yupladder)
  625.     ) {
  626.                     You("hit your %s on the ceiling.",
  627.                         body_part(HEAD));
  628.                     losehp(uarmh ? 1 : rnd(10),
  629.                         "colliding with the ceiling",
  630.                         KILLED_BY);
  631.                 } else (void) doup();
  632.             }
  633.         } else
  634.             nothing++;
  635.         if (otmp->blessed) {
  636.             char buf[BUFSZ];
  637.             int lmoves;
  638.  
  639.             makeknown(POT_LEVITATION);
  640.             do {
  641.     getlin("How many moves do you wish to levitate for? [1-300]", buf);
  642.                 lmoves = (!*buf || *buf=='\033') ? 0 : atoi(buf);
  643.             } while (lmoves < 1 || lmoves > 300);
  644.             HLevitation += lmoves;
  645.         } else HLevitation += rnd(150);
  646.         break;
  647.     case POT_GAIN_ENERGY:            /* M. Stephenson */
  648.         {    register int     num;
  649.             if(otmp->cursed)
  650.                 You("feel lackluster.");
  651.             else
  652.                 pline("Magical energies course through your body.");
  653.             num = rnd(5) + 5 * otmp->blessed + 1;
  654.             u.uenmax += (otmp->cursed) ? -num : num;
  655.             u.uen += (otmp->cursed) ? -num : num;
  656.             if(u.uenmax <= 0) u.uenmax = 0;
  657.             if(u.uen <= 0) u.uen = 0;
  658.             flags.botl = 1;
  659.             exercise(A_WIS, TRUE);
  660.         }
  661.         break;
  662.     default:
  663.         impossible("What a funny potion! (%u)", otmp->otyp);
  664.         return(0);
  665.     }
  666.     return(-1);
  667. }
  668.  
  669. void
  670. healup(nhp, nxtra, curesick, cureblind)
  671.     int    nhp, nxtra;
  672.     register boolean curesick, cureblind;
  673. {
  674. #ifdef POLYSELF
  675.     if (u.mtimedone && nhp) {
  676.         u.mh += nhp;
  677.         if (u.mh > u.mhmax) u.mh = (u.mhmax += nxtra);
  678.     }
  679. #endif
  680.     if(nhp)    {
  681.         u.uhp += nhp;
  682.         if(u.uhp > u.uhpmax)    u.uhp = (u.uhpmax += nxtra);
  683.     }
  684.     if(cureblind)    make_blinded(0L,TRUE);
  685.     if(curesick)    make_sick(0L,TRUE);
  686.     flags.botl = 1;
  687.     return;
  688. }
  689.  
  690. void
  691. strange_feeling(obj,txt)
  692. register struct obj *obj;
  693. register const char *txt;
  694. {
  695.     if(flags.beginner)
  696.         You("have a %s feeling for a moment, then it passes.",
  697.         Hallucination ? "normal" : "strange");
  698.     else
  699.         pline(txt);
  700.  
  701.     if(!obj)    /* e.g., crystal ball finds no traps */
  702.         return;
  703.  
  704.     if(obj->dknown && !objects[obj->otyp].oc_name_known &&
  705.                         !objects[obj->otyp].oc_uname)
  706.         docall(obj);
  707.     useup(obj);
  708. }
  709.  
  710. const char *bottlenames[] = {
  711.     "bottle", "phial", "flagon", "carafe", "flask", "jar", "vial"
  712. };
  713.  
  714. void
  715. potionhit(mon, obj)
  716. register struct monst *mon;
  717. register struct obj *obj;
  718. {
  719.     register const char *botlnam = bottlenames[rn2(SIZE(bottlenames))];
  720.     boolean distance, isyou = (mon == &youmonst);
  721.  
  722.     if(isyou) {
  723.         distance = 0;
  724.         pline("The %s crashes on your %s and breaks into shards.",
  725.             botlnam, body_part(HEAD));
  726.         losehp(rnd(2), "thrown potion", KILLED_BY_AN);
  727.     } else {
  728.         distance = distu(mon->mx,mon->my);
  729.         if (!cansee(mon->mx,mon->my)) pline("Crash!");
  730.         else {
  731.             char *mnam = mon_nam(mon);
  732.             char buf[BUFSZ];
  733.  
  734.             if(has_head(mon->data)) {
  735.             Sprintf(buf, "%s %s",
  736.                 s_suffix(mnam),
  737.                 (notonhead ? "body" : "head"));
  738.             } else {
  739.             Strcpy(buf, mnam);
  740.             }
  741.             pline("The %s crashes on %s and breaks into shards.",
  742.                botlnam, buf);
  743.         }
  744.         if(rn2(5) && mon->mhp > 1)
  745.             mon->mhp--;
  746.     }
  747.  
  748.     if (cansee(mon->mx,mon->my))
  749.         pline("%s evaporates.", The(xname(obj)));
  750.  
  751.     if (!isyou) switch (obj->otyp) {
  752.  
  753.     case POT_RESTORE_ABILITY:
  754.     case POT_GAIN_ABILITY:
  755.     case POT_HEALING:
  756.     case POT_EXTRA_HEALING:
  757.         if(mon->mhp < mon->mhpmax) {
  758.             mon->mhp = mon->mhpmax;
  759.             if (canseemon(mon))
  760.             pline("%s looks sound and hale again.", Monnam(mon));
  761.         }
  762.         break;
  763.     case POT_SICKNESS:
  764.         if((mon->mhpmax > 3) && !resist(mon, POTION_CLASS, 0, NOTELL))
  765.             mon->mhpmax /= 2;
  766.         if((mon->mhp > 2) && !resist(mon, POTION_CLASS, 0, NOTELL))
  767.             mon->mhp /= 2;
  768.         if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax;
  769.         if (canseemon(mon))
  770.             pline("%s looks rather ill.", Monnam(mon));
  771.         break;
  772.     case POT_CONFUSION:
  773.     case POT_BOOZE:
  774.         if(!resist(mon, POTION_CLASS, 0, NOTELL))  mon->mconf = TRUE;
  775.         break;
  776.     case POT_INVISIBILITY:
  777.         mon->minvis = TRUE;
  778.         newsym(mon->mx,mon->my);
  779.         break;
  780.     case POT_PARALYSIS:
  781.         if (mon->mcanmove) {
  782.             mon->mcanmove = 0;
  783.             /* really should be rnd(5) for consistency with players
  784.              * breathing potions, but...
  785.              */
  786.             mon->mfrozen = rnd(25);
  787.         }
  788.         break;
  789.     case POT_SPEED:
  790.         if (mon->mspeed == MSLOW) mon->mspeed = 0;
  791.         else mon->mspeed = MFAST;
  792.         break;
  793.     case POT_BLINDNESS:
  794.         if(haseyes(mon->data)) {
  795.             register int btmp = 64 + rn2(32) +
  796.             rn2(32) * !resist(mon, POTION_CLASS, 0, NOTELL);
  797.             mon->mblinded |= btmp;
  798.             mon->mcansee = 0;
  799.         }
  800.         break;
  801.     case POT_WATER:
  802.         if (is_undead(mon->data) || is_demon(mon->data)) {
  803.             if (obj->blessed) {
  804.                 pline("%s shrieks in pain!", Monnam(mon));
  805.                 mon->mhp -= d(2,6);
  806.                 if (mon->mhp <1) killed(mon);
  807.             } else if (obj->cursed) {
  808.                 if (canseemon(mon))
  809.                     pline("%s looks healthier.", Monnam(mon));
  810.                 mon->mhp += d(2,6);
  811.                 if (mon->mhp > mon->mhpmax)
  812.                     mon->mhp = mon->mhpmax;
  813.             }
  814.         } else if(mon->data == &mons[PM_GREMLIN]) {
  815.             struct monst *mtmp2 = clone_mon(mon);
  816.  
  817.             if (mtmp2) {
  818.                 mtmp2->mhpmax = (mon->mhpmax /= 2);
  819.                 if (canseemon(mon))
  820.                     pline("%s multiplies.", Monnam(mon));
  821.             }
  822.         }
  823.         break;
  824. /*
  825.     case POT_GAIN_LEVEL:
  826.     case POT_LEVITATION:
  827.     case POT_FRUIT_JUICE:
  828.     case POT_MONSTER_DETECTION:
  829.     case POT_OBJECT_DETECTION:
  830.         break;
  831. */
  832.     }
  833.     /* Note: potionbreathe() does its own docall() */
  834.     if (distance==0 || ((distance < 3) && rn2(5)))
  835.         potionbreathe(obj);
  836.     else if (obj->dknown && !objects[obj->otyp].oc_name_known &&
  837.            !objects[obj->otyp].oc_uname && cansee(mon->mx,mon->my))
  838.         docall(obj);
  839.     if(*u.ushops && obj->unpaid) {
  840.             register struct monst *shkp =
  841.             shop_keeper(*in_rooms(u.ux, u.uy, SHOPBASE));
  842.  
  843.         if(!shkp)
  844.             obj->unpaid = 0;
  845.         else {
  846.             (void)stolen_value(obj, u.ux, u.uy,
  847.                  (boolean)shkp->mpeaceful, FALSE);
  848.             subfrombill(obj, shkp);
  849.         }
  850.     }
  851.     obfree(obj, (struct obj *)0);
  852. }
  853.  
  854. void
  855. potionbreathe(obj)
  856. register struct obj *obj;
  857. {
  858.     register int i, ii, isdone, kn = 0;
  859.  
  860.     switch(obj->otyp) {
  861.     case POT_RESTORE_ABILITY:
  862.     case POT_GAIN_ABILITY:
  863.         if(obj->cursed) {
  864.             pline("Ulch!  That potion smells terrible!");
  865.             break;
  866.         } else {
  867.             i = rn2(A_MAX);        /* start at a random point */
  868.             for(isdone = ii = 0; !isdone && ii < A_MAX; ii++) {
  869.             if(ABASE(i) < AMAX(i)) {
  870.                 ABASE(i)++;
  871.                 /* only first found if not blessed */
  872.                 isdone = !(obj->blessed);
  873.                 flags.botl = 1;
  874.             }
  875.             if(++i >= A_MAX) i = 0;
  876.             }
  877.         }
  878.         break;
  879.     case POT_HEALING:
  880.     case POT_EXTRA_HEALING:
  881.         if(u.uhp < u.uhpmax) u.uhp++, flags.botl = 1;
  882.         exercise(A_STR, TRUE);
  883.         break;
  884.     case POT_SICKNESS:
  885.         if (pl_character[0] != 'H') {
  886.             if(u.uhp <= 5) u.uhp = 1; else u.uhp -= 5;
  887.             flags.botl = 1;
  888.             exercise(A_CON, FALSE);
  889.         }
  890.         break;
  891.     case POT_HALLUCINATION:
  892.         You("have a momentary vision.");
  893.         break;
  894.     case POT_CONFUSION:
  895.     case POT_BOOZE:
  896.         if(!Confusion)
  897.             You("feel somewhat dizzy.");
  898.         make_confused(HConfusion + rnd(5),FALSE);
  899.         break;
  900.     case POT_INVISIBILITY:
  901.         if (!See_invisible && !Invis)
  902.             pline("For an instant you could see through yourself!");
  903.         break;
  904.     case POT_PARALYSIS:
  905.         kn++;
  906.         pline("Something seems to be holding you.");
  907.         nomul(-rnd(5));
  908.         exercise(A_DEX, FALSE);
  909.         break;
  910.     case POT_SPEED:
  911.         if (!Fast) Your("knees seem more flexible now.");
  912.         Fast += rnd(5);
  913.         exercise(A_DEX, TRUE);
  914.         break;
  915.     case POT_BLINDNESS:
  916.         if (!Blind && !u.usleep) {
  917.             kn++;
  918.             pline("It suddenly gets dark.");
  919.         }
  920.         make_blinded(Blinded + rnd(5), FALSE);
  921.         break;
  922.     case POT_WATER:
  923. #ifdef POLYSELF
  924.         if(u.umonnum == PM_GREMLIN) {
  925.             struct monst *mtmp;
  926.             if ((mtmp = cloneu()) != 0) {
  927.             mtmp->mhpmax = (u.mhmax /= 2);
  928.             You("multiply.");
  929.             }
  930.         }
  931. #endif
  932. /*
  933.     case POT_GAIN_LEVEL:
  934.     case POT_LEVITATION:
  935.     case POT_FRUIT_JUICE:
  936.     case POT_MONSTER_DETECTION:
  937.     case POT_OBJECT_DETECTION:
  938. */
  939.         break;
  940.     }
  941.     /* note: no obfree() */
  942.     if (obj->dknown)
  943.         if (kn)
  944.         makeknown(obj->otyp);
  945.         else if (!objects[obj->otyp].oc_name_known &&
  946.                         !objects[obj->otyp].oc_uname)
  947.         docall(obj);
  948. }
  949.  
  950. static boolean
  951. neutralizes(o1, o2)
  952. register struct obj *o1, *o2;
  953. {
  954.     switch (o1->otyp) {
  955.         case POT_SICKNESS:
  956.         case POT_HALLUCINATION:
  957.         case POT_BLINDNESS:
  958.         case POT_CONFUSION:
  959.             if (o2->otyp == POT_HEALING ||
  960.                 o2->otyp == POT_EXTRA_HEALING)
  961.                 return TRUE;
  962.         case POT_HEALING:
  963.         case POT_EXTRA_HEALING:
  964.         case UNICORN_HORN:
  965.             if (o2->otyp == POT_SICKNESS ||
  966.                 o2->otyp == POT_HALLUCINATION ||
  967.                 o2->otyp == POT_BLINDNESS ||
  968.                 o2->otyp == POT_CONFUSION)
  969.                 return TRUE;
  970.     }
  971.  
  972.     return FALSE;
  973. }
  974.  
  975. boolean
  976. get_wet(obj)
  977. register struct obj *obj;
  978. /* returns TRUE if something happened (potion should be used up) */
  979. {
  980.         if(snuff_lit(obj)) return(TRUE);
  981.  
  982.     if (obj->greased) {
  983.         grease_protect(obj,NULL,FALSE);
  984.         return(FALSE);
  985.     }
  986.     switch (obj->oclass) {
  987.         case WEAPON_CLASS:
  988.         if (!obj->oerodeproof && is_rustprone(obj) &&
  989.             (obj->oeroded < MAX_ERODE) && !rn2(10)) {
  990.             Your("%s some%s.", aobjnam(obj, "rust"),
  991.                  obj->oeroded ? " more" : "what");
  992.             obj->oeroded++;
  993.             return TRUE;
  994.         } else break;
  995.         case POTION_CLASS:
  996.         if (obj->otyp == POT_WATER) return FALSE;
  997.         Your("%s.", aobjnam(obj,"dilute"));
  998.         if (obj->odiluted) {
  999.             obj->odiluted = 0;
  1000.             obj->blessed = obj->cursed = FALSE;
  1001.             obj->otyp = POT_WATER;
  1002.         } else obj->odiluted++;
  1003.         return TRUE;
  1004.         case SCROLL_CLASS:
  1005.         if (obj->otyp != SCR_BLANK_PAPER
  1006. #ifdef MAIL
  1007.             && obj->otyp != SCR_MAIL
  1008. #endif
  1009.             ) {
  1010.             if (!Blind) {
  1011.                 boolean oq1 = obj->quan == 1L;
  1012.                 pline("The scroll%s fade%s.",
  1013.                     oq1 ? "" : "s",
  1014.                     oq1 ? "s" : "");
  1015.             }
  1016.             if(obj->unpaid) {
  1017.                 subfrombill(obj, shop_keeper(*u.ushops));
  1018.                 You("erase it, you pay for it.");
  1019.                 bill_dummy_object(obj);
  1020.             }
  1021.             obj->otyp = SCR_BLANK_PAPER;
  1022.             return TRUE;
  1023.         } else break;
  1024.         case SPBOOK_CLASS:
  1025.         if (obj->otyp != SPE_BLANK_PAPER) {
  1026.  
  1027.             if (obj->otyp == SPE_BOOK_OF_THE_DEAD) {
  1028.     pline("%s suddenly heats up; steam rises and it remains dry.",
  1029.                 The(xname(obj)));
  1030.             } else {
  1031.                 if (!Blind) {
  1032.                     boolean oq1 = obj->quan == 1L;
  1033.                     pline("The spellbook%s fade%s.",
  1034.                     oq1 ? "" : "s", oq1 ? "s" : "");
  1035.                 }
  1036.                 if(obj->unpaid) {
  1037.                     subfrombill(obj, shop_keeper(*u.ushops));
  1038.                     You("erase it, you pay for it.");
  1039.                     bill_dummy_object(obj);
  1040.                 }
  1041.                 obj->otyp = SPE_BLANK_PAPER;
  1042.             }
  1043.             return TRUE;
  1044.         }
  1045.     }
  1046.     Your("%s wet.", aobjnam(obj,"get"));
  1047.     return FALSE;
  1048. }
  1049.  
  1050. int
  1051. dodip()
  1052. {
  1053.     register struct obj *potion, *obj;
  1054.     const char *tmp;
  1055.     uchar here;
  1056.     char allow_all[2];
  1057.     char c;
  1058.  
  1059.     allow_all[0] = ALL_CLASSES; allow_all[1] = '\0';
  1060.     if(!(obj = getobj(allow_all, "dip")))
  1061.         return(0);
  1062.  
  1063.     here = levl[u.ux][u.uy].typ;
  1064.     /* Is there a fountain to dip into here? */
  1065.     if (IS_FOUNTAIN(here)) {
  1066.         if(yn("Dip it into the fountain?") == 'y') {
  1067.             dipfountain(obj);
  1068.             return(1);
  1069.         }
  1070.     }
  1071.         if (is_pool(u.ux,u.uy)) {
  1072.         c = (here == POOL) ? yn("Dip it into the pool?")
  1073.                    : yn("Dip it into the moat?");
  1074.         if(c == 'y') {
  1075.             (void) get_wet(obj);
  1076.             return(1);
  1077.         }
  1078.     }
  1079.  
  1080.     if(!(potion = getobj(beverages, "dip into")))
  1081.         return(0);
  1082.     if (potion == obj && potion->quan == 1L) {
  1083.         pline("That is a potion bottle, not a Klein bottle!");
  1084.         return 0;
  1085.     }
  1086.     if(potion->otyp == POT_WATER) {
  1087.         if (potion->blessed) {
  1088.             if (obj->cursed) {
  1089.                 if (!Blind)
  1090.                     Your("%s %s.",
  1091.                       aobjnam(obj, "softly glow"),
  1092.                       Hallucination ? hcolor() : amber);
  1093.                 uncurse(obj);
  1094.                 obj->bknown=1;
  1095.     poof:
  1096.                 if(!(objects[potion->otyp].oc_name_known) &&
  1097.                    !(objects[potion->otyp].oc_uname))
  1098.                     docall(potion);
  1099.                 useup(potion);
  1100.                 return(1);
  1101.             } else if(!obj->blessed) {
  1102.                 if (!Blind) {
  1103.                     tmp = Hallucination ? hcolor() : light_blue;
  1104.                     Your("%s with a%s %s aura.",
  1105.                       aobjnam(obj, "softly glow"),
  1106.                       index(vowels, *tmp) ? "n" : "", tmp);
  1107.                 }
  1108.                 bless(obj);
  1109.                 obj->bknown=1;
  1110.                 goto poof;
  1111.             }
  1112.         } else if (potion->cursed) {
  1113.             if (obj->blessed) {
  1114.                 if (!Blind)
  1115.                     Your("%s %s.", aobjnam(obj, "glow"),
  1116.                      Hallucination ? hcolor() : (const char *)"brown");
  1117.                 unbless(obj);
  1118.                 obj->bknown=1;
  1119.                 goto poof;
  1120.             } else if(!obj->cursed) {
  1121.                 if (!Blind) {
  1122.                     tmp = Hallucination ? hcolor() : Black;
  1123.                     Your("%s with a%s %s aura.",
  1124.                       aobjnam(obj, "glow"),
  1125.                       index(vowels, *tmp) ? "n" : "", tmp);
  1126.                 }
  1127.                 curse(obj);
  1128.                 obj->bknown=1;
  1129.                 goto poof;
  1130.             }
  1131.         } else
  1132.             if (get_wet(obj))
  1133.                 goto poof;
  1134.     }
  1135.     else if(obj->oclass == POTION_CLASS && obj->otyp != potion->otyp) {
  1136.         /* Mixing potions is dangerous... */
  1137.         pline("The potions mix...");
  1138.         if (obj->cursed || !rn2(10)) {
  1139.             pline("BOOM!  They explode!");
  1140.             exercise(A_STR, FALSE);
  1141.             potionbreathe(obj);
  1142.             useup(obj);
  1143.             useup(potion);
  1144.             losehp(rnd(10), "alchemic blast", KILLED_BY_AN);
  1145.             return(1);
  1146.         }
  1147.  
  1148.         obj->blessed = obj->cursed = obj->bknown = 0;
  1149.         if (Blind) obj->dknown = 0;
  1150.  
  1151.         switch (neutralizes(obj, potion) ||
  1152.             obj->odiluted ? 1 : rnd(8)) {
  1153.             case 1:
  1154.                 obj->otyp = POT_WATER;
  1155.                 obj->blessed = obj->cursed = 0;
  1156.                 break;
  1157.             case 2:
  1158.             case 3:
  1159.                 obj->otyp = POT_SICKNESS;
  1160.                 break;
  1161.             case 4:
  1162.                 {
  1163.                   struct obj *otmp;
  1164.                   otmp = mkobj(POTION_CLASS,FALSE);
  1165.                   obj->otyp = otmp->otyp;
  1166.                   obfree(otmp, (struct obj *)0);
  1167.                 }
  1168.                 break;
  1169.             default:
  1170.                 if (!Blind)
  1171.                 pline("The mixture glows brightly and evaporates.");
  1172.                 useup(obj);
  1173.                 useup(potion);
  1174.                 return(1);
  1175.         }
  1176.  
  1177.         if (obj->otyp == POT_WATER) {
  1178.             obj->odiluted = 0; /* in case it was diluted before */
  1179.             pline("The mixture bubbles violently%s.",
  1180.                 Blind ? "" : ", then clears");
  1181.         } else {
  1182.             obj->odiluted++;
  1183.             if (!Blind) {
  1184.                 pline("The mixture looks %s.",
  1185.                     OBJ_DESCR(objects[obj->otyp]));
  1186.                 obj->dknown = TRUE;
  1187.             }
  1188.         }
  1189.  
  1190.         useup(potion);
  1191.         return(1);
  1192.     }
  1193.  
  1194.     if(obj->oclass == WEAPON_CLASS && obj->otyp <= SHURIKEN) {
  1195.         if(potion->otyp == POT_SICKNESS && !obj->opoisoned) {
  1196.         char buf[BUFSZ];
  1197.         Strcpy(buf, The(xname(potion)));
  1198.         pline("%s form%s a coating on %s.",
  1199.             buf, potion->quan == 1L ? "s" : "", the(xname(obj)));
  1200.         obj->opoisoned = TRUE;
  1201.         goto poof;
  1202.         } else if(obj->opoisoned &&
  1203.               (potion->otyp == POT_HEALING ||
  1204.                potion->otyp == POT_EXTRA_HEALING)) {
  1205.         pline("A coating wears off %s.", the(xname(obj)));
  1206.         obj->opoisoned = 0;
  1207.         goto poof;
  1208.         }
  1209.     }
  1210.  
  1211.     if(obj->otyp == UNICORN_HORN && neutralizes(obj, potion)) {
  1212.         /* with multiple merged potions, we should split off one and
  1213.            just clear it, but clearing them all together is easier */
  1214.         boolean more_than_one = potion->quan > 1L;
  1215.         pline("The potion%s clear%s.",
  1216.             more_than_one ? "s" : "",
  1217.             more_than_one ? "" : "s");
  1218.         potion->otyp = POT_WATER;
  1219.         potion->blessed = 0;
  1220.         potion->cursed = 0;
  1221.         potion->odiluted = 0;
  1222.         return(1);
  1223.     }
  1224.  
  1225.     pline("Interesting...");
  1226.     return(1);
  1227. }
  1228.  
  1229.  
  1230. void
  1231. djinni_from_bottle(obj)
  1232. register struct obj *obj;
  1233. {
  1234.     register struct monst *mtmp;
  1235.  
  1236.     if(!(mtmp = makemon(&mons[PM_DJINNI], u.ux, u.uy))){
  1237.         pline("It turns out to be empty.");
  1238.         return;
  1239.     }
  1240.  
  1241.     if (!Blind) {
  1242.         pline("In a cloud of smoke, %s emerges!", a_monnam(mtmp));
  1243.         pline("%s speaks.", Monnam(mtmp));
  1244.     } else {
  1245.         You("smell acrid fumes.");
  1246.         pline("Something speaks.");
  1247.     }
  1248.  
  1249.     switch (obj->blessed ? 0 : obj->cursed ? 4 : rn2(5)) {
  1250.     case 0 : verbalize("I am in your debt.  I will grant one wish!");
  1251.         makewish();
  1252.         mongone(mtmp);
  1253.         break;
  1254.     case 1 : verbalize("Thank you for freeing me!");
  1255.         (void) tamedog(mtmp, (struct obj *)0);
  1256.         break;
  1257.     case 2 : verbalize("You freed me!");
  1258.         mtmp->mpeaceful = TRUE;
  1259.         set_malign(mtmp);
  1260.         break;
  1261.     case 3 : verbalize("It is about time!");
  1262.         pline("%s vanishes.", Monnam(mtmp));
  1263.         mongone(mtmp);
  1264.         break;
  1265.     default: verbalize("You disturbed me, fool!");
  1266.         break;
  1267.     }
  1268. }
  1269.  
  1270. #endif /* OVLB */
  1271.  
  1272. /*potion.c*/
  1273.